Analiza medijske pokrivenosti inflacije u Hrvatskoj
Eksploratorni pregled, konstrukcija indeksa i analiza prediktivnosti
Author
lux
Published
29. prosinca 2025.
1 Uvod
Ovaj izvještaj predstavlja sveobuhvatnu analizu medijske pokrivenosti inflacije u Hrvatskoj u razdoblju od siječnja 2021. do studenog 2024. godine. Analiza se temelji na člancima prikupljenim iz hrvatskih online medija koristeći naprednu metodologiju filtriranja i validacije sadržaja.
1.1 Motivacija i kontekst
Inflacija je tijekom 2022. i 2023. godine postala središnja tema ekonomske rasprave u Hrvatskoj i šire. Ovaj izvještaj nastoji odgovoriti na ključna pitanja:
Kako se medijsko izvještavanje o inflaciji razvijalo kroz vrijeme?
Je li medijska pozornost odgovarala stvarnim inflacijskim pritiscima?
Može li se medijska pozornost koristiti kao prediktor ili rani indikator inflacije?
Koje su teme i aspekti inflacije najzastupljeniji u medijima?
1.2 Struktura izvještaja
Metodologija prikupljanja podataka detaljan opis procesa identifikacije relevantnih članaka
Eksploratorni pregled struktura i karakteristike dataseta
Vremenska analiza dinamika izvještavanja kroz različite vremenske horizonte
Analiza sadržaja i text mining dubinska analiza sadržaja članaka
Analiza semantičkih pojmova brojanje inflacijskih i srodnih pojmova
Identifikacija relevantnih članaka provedena je kroz šestostupanjski proces filtriranja koji kombinira strukturne kriterije, ključne riječi i kontekstualnu validaciju.
2.2 Pregled filtera
Filter 1: Tip izvora (samo web) Filter 2: Relevantni news portali (80+ verificiranih portala) Filter 3: Minimalna duljina teksta (>= 500 znakova) Filter 4: Naslov mora sadržavati inflacijske pojmove Filter 5: Core inflacijski pojmovi u tekstu Filter 6: Hrvatski kontekst (reference na hrvatsku ekonomiju)
Detaljni opis svakog filtera i regex uzoraka dostupan je u dokumentaciji projekta.
5 Dnevni broj spominjanja inflacije kao samostalni indikator
Dnevni broj članaka o inflaciji predstavlja jednostavan ali informativan pokazatelj medijske pozornosti na inflacijske teme. Ovaj indikator može služiti kao real-time proxy za javnu percepciju inflacijskih pritisaka u Hrvatskoj.
5.1 Metodologija
Indikator se temelji na jednostavnom brojanju članaka koji zadovoljavaju kriterije filtriranja za inflacijsku tematiku. Za izglađivanje dnevnih fluktuacija koristi se 30-dnevni klizni prosjek koji daje stabilniju sliku trenda medijske pozornosti.
5.2 Dnevni indikator medijske pozornosti na inflaciju
Prikaži kod
# Izračunaj statistike za anotacijepeak_date <- daily[which.max(MA30), date]peak_value <- daily[which.max(MA30), MA30]avg_value <-mean(daily$MA30, na.rm =TRUE)# Identificiraj ključne periodedaily[, period :=fcase( date <as.Date("2022-01-01"), "Pred-inflacijski period", date >=as.Date("2022-01-01") & date <as.Date("2023-07-01"), "Inflacijski vrhunac", date >=as.Date("2023-07-01"), "Normalizacija")]ggplot(daily, aes(x = date)) +# Pozadinske zone za periodegeom_rect(aes(xmin =as.Date("2022-01-01"), xmax =as.Date("2023-07-01"),ymin =-Inf, ymax =Inf), fill = colors_gimes["secondary"], alpha =0.1) +# Dnevni podaci kao stupcigeom_col(aes(y = N), fill ="gray80", alpha =0.4, width =1) +# Klizni prosjecigeom_line(aes(y = MA7), color = colors_gimes["accent"], linewidth =0.6, alpha =0.6, na.rm =TRUE) +geom_line(aes(y = MA30), color = colors_gimes["primary"], linewidth =1.3, na.rm =TRUE) +# Horizontalna linija za prosjekgeom_hline(yintercept = avg_value, color = colors_gimes["warning"], linetype ="dashed", linewidth =0.8) +# Anotacija za vrhunacannotate("point", x = peak_date, y = peak_value, color = colors_gimes["secondary"], size =4) +annotate("text", x = peak_date, y = peak_value +3, label =paste0("Vrhunac: ", format(peak_date, "%d.%m.%Y")),color = colors_gimes["secondary"], fontface ="bold", size =3.5, hjust =0) +# Anotacija za prosjekannotate("text", x =min(daily$date) +30, y = avg_value +2,label =paste0("Prosjek: ", round(avg_value, 1), " članaka/dan"),color = colors_gimes["warning"], fontface ="bold", size =3.5, hjust =0) +# Anotacije za periodeannotate("text", x =as.Date("2022-10-01"), y =max(daily$N, na.rm =TRUE) *0.95,label ="Inflacijski vrhunac", color = colors_gimes["secondary"], fontface ="italic", size =3.5) +scale_x_date(date_breaks ="3 months", date_labels ="%b\n%Y") +scale_y_continuous(labels = comma, expand =expansion(mult =c(0, 0.05))) +labs(title ="Dnevni broj spominjanja inflacije u hrvatskim medijima",subtitle ="Samostalni indikator medijske pozornosti | Tamna linija = 30-dnevni MA | Svijetla linija = 7-dnevni MA",x =NULL,y ="Broj članaka" ) +theme(plot.title =element_text(face ="bold", size =14),plot.subtitle =element_text(size =10, color ="gray40"),panel.grid.minor =element_blank(),axis.text.x =element_text(size =9) )
Dnevni broj spominjanja inflacije kao samostalni indikator
5.3 Normalizirani dnevni indikator (0-100)
Prikaži kod
# Normaliziraj 30-dnevni MA na skalu 0-100daily[, MA30_norm := (MA30 -min(MA30, na.rm =TRUE)) / (max(MA30, na.rm =TRUE) -min(MA30, na.rm =TRUE)) *100]ggplot(daily[!is.na(MA30_norm)], aes(x = date)) +geom_ribbon(aes(ymin =0, ymax = MA30_norm), fill = colors_gimes["accent"], alpha =0.3) +geom_line(aes(y = MA30_norm), color = colors_gimes["primary"], linewidth =1.2) +# Zone intenzitetageom_hline(yintercept =c(25, 50, 75), linetype ="dotted", color ="gray60") +annotate("text", x =max(daily$date) -60, y =12.5, label ="Niska pozornost", color ="gray50", size =3, fontface ="italic") +annotate("text", x =max(daily$date) -60, y =37.5, label ="Umjerena pozornost", color ="gray50", size =3, fontface ="italic") +annotate("text", x =max(daily$date) -60, y =62.5, label ="Visoka pozornost", color ="gray50", size =3, fontface ="italic") +annotate("text", x =max(daily$date) -60, y =87.5, label ="Vrlo visoka pozornost", color ="gray50", size =3, fontface ="italic") +scale_x_date(date_breaks ="3 months", date_labels ="%b\n%Y") +scale_y_continuous(limits =c(0, 100), breaks =seq(0, 100, 25)) +labs(title ="Normalizirani indikator medijske pozornosti na inflaciju",subtitle ="Skala 0-100 temeljena na 30-dnevnom kliznom prosjeku broja članaka",x =NULL,y ="Indeks medijske pozornosti" ) +theme(plot.title =element_text(face ="bold", size =14),plot.subtitle =element_text(size =10, color ="gray40"),panel.grid.minor =element_blank() )
6 Analiza semantičkih pojmova povezanih s inflacijom
Ova sekcija proširuje analizu brojanja riječi inflacija na širi skup semantički povezanih pojmova koji mogu bolje pratiti inflacijske trendove u medijskom izvještavanju.
# Testiraj različite kombinacije kategorija# Izračunaj kompozitni indeks koristeći samo top kategorije po korelacijitop_categories <- correlation_results[Kategorija !="SVE KATEGORIJE"][order(-Korelacija)][1:4, Kategorija]semantic_hicp[, top_composite :=rowSums(.SD), .SDcols =paste0("count_", top_categories)]# Korelacija kompozitnog indeksacor_composite <-cor(semantic_hicp$top_composite, semantic_hicp$eurostat_hicp, use ="complete.obs")# Normaliziraj za vizualizacijucoef_composite <-max(semantic_hicp$eurostat_hicp, na.rm =TRUE) /max(semantic_hicp$top_composite, na.rm =TRUE)ggplot(semantic_hicp, aes(x = yearmonth)) +geom_line(aes(y = top_composite * coef_composite, color ="Kompozitni indeks"), linewidth =1.2) +geom_line(aes(y = eurostat_hicp, color ="Eurostat HICP"), linewidth =1.2, linetype ="dashed") +scale_y_continuous(name ="HICP (%)",sec.axis =sec_axis(~./coef_composite, name ="Broj pojmova (kompozit)") ) +scale_x_date(date_breaks ="3 months", date_labels ="%b\n%Y") +scale_color_manual(values =c("Kompozitni indeks"= colors_gimes["accent"],"Eurostat HICP"= colors_gimes["secondary"])) +labs(title ="Kompozitni semantički indeks (top 4 kategorije) vs HICP",subtitle =paste0("Kategorije: ", paste(top_categories, collapse =", "), " | r = ", round(cor_composite, 3)),x =NULL,color =NULL ) +theme(plot.title =element_text(face ="bold"),legend.position ="bottom" )
Najbolja kombinacija semantičkih pojmova za predikciju inflacije
7 GIMES Indeks medijske inflacije
7.1 Metodologija
GIMES indeks (Government-Industry-Media Economic Sentiment) medijske inflacije konstruiran je kao kompozitni pokazatelj koji kombinira četiri dimenzije medijskog izvještavanja:
7.1.1 Komponente indeksa
Volumen (40% težina)
Broj članaka o inflaciji u mjesecu
Normaliziran na skalu 0-100
Veći broj članaka = veća medijska pozornost
Intenzitet (20% težina)
Prosječna duljina članaka (broj znakova)
Odražava dubinu analize
Duži članci = detaljnije izvještavanje
Sentiment (20% težina)
Prosječni sentiment članaka (invertiran)
-1 (negativan), 0 (neutralan), 1 (pozitivan)
Negativniji sentiment = veća zabrinutost = viši indeks
Ova sekcija proširuje Y/y perspektivu s alternativnim dinamikama uključujući M/m (mjesec na mjesec) sezonski prilagođene stope te 3M i 6M anualizirane stope.
8.1 Sezonska prilagodba
Prikaži kod
# Pripremi vremenski niz za sezonsku prilagodbu# Koristimo STL dekompoziciju jer je robustnija za kratke serije s volatilnim podacima# GIMES indeks kao ts objektgimes_ts <-ts(index_data$gimes_index, start =c(year(min(index_data$yearmonth)), month(min(index_data$yearmonth))),frequency =12)# Semantički indeks kao ts objektsemantic_ts <-ts(index_data$semantic_total,start =c(year(min(index_data$yearmonth)), month(min(index_data$yearmonth))),frequency =12)# Volumen kao ts objektvolume_ts <-ts(index_data$volume,start =c(year(min(index_data$yearmonth)), month(min(index_data$yearmonth))),frequency =12)# STL dekompozicija za GIMESstl_gimes <-tryCatch({stl(gimes_ts, s.window ="periodic", robust =TRUE)}, error =function(e) {message("STL dekompozicija za GIMES nije uspjela: ", e$message)NULL})# STL dekompozicija za semantički indeksstl_semantic <-tryCatch({stl(semantic_ts, s.window ="periodic", robust =TRUE)}, error =function(e) {message("STL dekompozicija za semantički indeks nije uspjela: ", e$message)NULL})# STL dekompozicija za volumenstl_volume <-tryCatch({stl(volume_ts, s.window ="periodic", robust =TRUE)}, error =function(e) {message("STL dekompozicija za volumen nije uspjela: ", e$message)NULL})# Dodaj desezonirane vrijednosti u index_dataif(!is.null(stl_gimes)) { index_data[, gimes_sa :=as.numeric(seasadj(stl_gimes))]} else { index_data[, gimes_sa := gimes_index] # Fallback na originalne vrijednosti}if(!is.null(stl_semantic)) { index_data[, semantic_sa :=as.numeric(seasadj(stl_semantic))]} else { index_data[, semantic_sa := semantic_total]}if(!is.null(stl_volume)) { index_data[, volume_sa :=as.numeric(seasadj(stl_volume))]} else { index_data[, volume_sa := volume]}
dynamics_df <- index_data[, .( yearmonth,`Y/Y (%)`= gimes_yoy_pct,`M/M SA (%)`= gimes_mom_sa,`3M ann. SA (%)`= gimes_3m_ann,`6M ann. SA (%)`= gimes_6m_ann)]dynamics_long <-melt(dynamics_df, id.vars ="yearmonth",variable.name ="dinamika", value.name ="stopa")ggplot(dynamics_long[!is.na(stopa)], aes(x = yearmonth, y = stopa, color = dinamika)) +geom_hline(yintercept =0, color ="gray50", linetype ="dashed") +geom_line(linewidth =1) +facet_wrap(~dinamika, ncol =2, scales ="free_y") +scale_x_date(date_breaks ="6 months", date_labels ="%b %y") +scale_color_manual(values =c("Y/Y (%)"= colors_gimes["primary"],"M/M SA (%)"= colors_gimes["accent"],"3M ann. SA (%)"= colors_gimes["success"],"6M ann. SA (%)"= colors_gimes["warning"] )) +labs(title ="Usporedba različitih dinamika GIMES indeksa",subtitle ="Y/Y = godina na godinu | M/M SA = mjesec na mjesec sezonski prilagođeno | XM ann. SA = X-mjesečna anualizirana SA",x =NULL,y ="Promjena (%)",color =NULL ) +theme(plot.title =element_text(face ="bold"),legend.position ="none",strip.text =element_text(face ="bold"),axis.text.x =element_text(angle =45, hjust =1) )
Usporedba različitih dinamika GIMES indeksa
8.5 Sve dinamike na jednom grafu
Prikaži kod
ggplot(dynamics_long[!is.na(stopa) & dinamika !="M/M SA (%)"], aes(x = yearmonth, y = stopa, color = dinamika)) +geom_hline(yintercept =0, color ="gray50", linetype ="dashed") +geom_line(linewidth =1, alpha =0.8) +scale_x_date(date_breaks ="3 months", date_labels ="%b\n%Y") +scale_color_manual(values =c("Y/Y (%)"= colors_gimes["primary"],"3M ann. SA (%)"= colors_gimes["success"],"6M ann. SA (%)"= colors_gimes["warning"] )) +labs(title ="Usporedba dinamika GIMES indeksa",subtitle ="Y/Y, 3M i 6M anualizirane sezonski prilagođene stope",x =NULL,y ="Promjena (%)",color ="Dinamika" ) +theme(plot.title =element_text(face ="bold"),legend.position ="bottom" )
Sve dinamike GIMES indeksa na jednom grafu
8.6 Dinamike semantičkog indeksa
Prikaži kod
semantic_dynamics_df <- index_data[, .( yearmonth,`Y/Y (%)`= semantic_yoy_pct,`3M ann. SA (%)`= semantic_3m_ann,`6M ann. SA (%)`= semantic_6m_ann)]semantic_dynamics_long <-melt(semantic_dynamics_df, id.vars ="yearmonth",variable.name ="dinamika", value.name ="stopa")ggplot(semantic_dynamics_long[!is.na(stopa)], aes(x = yearmonth, y = stopa, color = dinamika)) +geom_hline(yintercept =0, color ="gray50", linetype ="dashed") +geom_line(linewidth =1, alpha =0.8) +scale_x_date(date_breaks ="3 months", date_labels ="%b\n%Y") +scale_color_manual(values =c("Y/Y (%)"= colors_gimes["secondary"],"3M ann. SA (%)"= colors_gimes["accent"],"6M ann. SA (%)"= colors_gimes["purple"] )) +labs(title ="Dinamike ukupnog semantičkog indeksa",subtitle ="Y/Y, 3M i 6M anualizirane sezonski prilagođene stope",x =NULL,y ="Promjena (%)",color ="Dinamika" ) +theme(plot.title =element_text(face ="bold"),legend.position ="bottom" )
Dinamike semantičkog indeksa
8.7 Tablica dinamika
Prikaži kod
dynamics_table <- index_data[, .(Mjesec =format(yearmonth, "%b %Y"),GIMES =round(gimes_index, 1),`GIMES SA`=round(gimes_sa, 1),`Y/Y (%)`=round(gimes_yoy_pct, 1),`M/M SA (%)`=round(gimes_mom_sa, 1),`3M ann. (%)`=round(gimes_3m_ann, 1),`6M ann. (%)`=round(gimes_6m_ann, 1))]kable(tail(dynamics_table, 12), caption ="Dinamike GIMES indeksa - zadnjih 12 mjeseci",align =c("l", rep("r", 6))) %>%kable_styling(bootstrap_options =c("striped", "hover", "condensed"), full_width =FALSE) %>%row_spec(0, bold =TRUE, background = colors_gimes["primary"], color ="white")
Dnevni broj članaka o inflaciji vs službena inflacija
9.4 Broj spominjanja riječi inflacija vs službena inflacija
Prikaži kod
# Koristimo već izračunate podatke iz semantic analizemonthly_mentions <- monthly_semantic[, .( yearmonth,total_mentions = count_inflacija_direktno,article_count = N)]# Spoji s Eurostat podacimamonthly_mentions <-merge(monthly_mentions, eurostat_headline, by ="yearmonth", all.x =TRUE)# Koeficijent za dual axiscoef_mentions <-max(monthly_mentions$total_mentions, na.rm =TRUE) /max(monthly_mentions$eurostat_hicp, na.rm =TRUE)ggplot(monthly_mentions, aes(x = yearmonth)) +geom_col(aes(y = total_mentions), fill = colors_gimes["primary"], alpha =0.7, width =25) +geom_line(aes(y = eurostat_hicp * coef_mentions, color ="Eurostat HICP"), linewidth =1.5) +geom_point(aes(y = eurostat_hicp * coef_mentions), color = colors_gimes["secondary"], size =2.5) +scale_y_continuous(name ="Broj spominjanja riječi inflacija",labels = comma,sec.axis =sec_axis(~./coef_mentions, name ="HICP Inflacija (YoY %)",labels =function(x) paste0(x, "%")) ) +scale_x_date(date_breaks ="3 months", date_labels ="%b\n%Y") +scale_color_manual(values =c("Eurostat HICP"= colors_gimes["secondary"])) +labs(title ="Broj spominjanja riječi inflacija vs službena inflacija",subtitle ="Ukupan mjesečni broj pojavljivanja korijena riječi inflacij* u medijskim člancima | Izvor inflacije: Eurostat HICP",x =NULL,color =NULL ) +theme(plot.title =element_text(face ="bold", size =14),plot.subtitle =element_text(size =10, color ="gray40"),legend.position ="bottom",axis.title.y.right =element_text(color = colors_gimes["secondary"], face ="bold"),axis.text.y.right =element_text(color = colors_gimes["secondary"]),axis.title.y.left =element_text(color = colors_gimes["primary"], face ="bold"),panel.grid.minor =element_blank() )
Mjesečni broj spominjanja riječi inflacija vs Eurostat HICP
9.5 Statistike spominjanja riječi inflacija
Prikaži kod
word_stats <-data.table(Metrika =c("Ukupan broj spominjanja riječi inflacija","Prosječno spominjanja po članku","Mjesec s najviše spominjanja","Maksimalan broj spominjanja (mjesec)","Korelacija s Eurostat HICP" ),Vrijednost =c(format(sum(monthly_mentions$total_mentions, na.rm =TRUE), big.mark =","),round(mean(dt$count_inflacija_direktno, na.rm =TRUE), 2),format(monthly_mentions[which.max(total_mentions), yearmonth], "%B %Y"),format(max(monthly_mentions$total_mentions, na.rm =TRUE), big.mark =","),round(cor(monthly_mentions$total_mentions, monthly_mentions$eurostat_hicp, use ="complete.obs"), 3) ))kable(word_stats, caption ="Statistike spominjanja riječi inflacija") %>%kable_styling(bootstrap_options =c("striped", "hover"), full_width =FALSE)
Statistike spominjanja riječi inflacija
Metrika
Vrijednost
Ukupan broj spominjanja riječi inflacija
27,149
Prosječno spominjanja po članku
0.59
Mjesec s najviše spominjanja
lipanj 2022
Maksimalan broj spominjanja (mjesec)
1,556
Korelacija s Eurostat HICP
0.867
9.6 Korelacijska tablica
Prikaži kod
correlations <-data.table(Usporedba =c("GIMES Index vs Eurostat HICP","GIMES Index vs Eurostat Core","GIMES Index vs DZS CPI","Volumen (broj članaka) vs Eurostat HICP","Semantički indeks (ukupno) vs Eurostat HICP","Semantički (inflacija direktno) vs Eurostat HICP" ),Korelacija =c(round(cor(comparison$gimes_index, comparison$eurostat_hicp, use ="complete.obs"), 3),round(cor(comparison$gimes_index, comparison$eurostat_core, use ="complete.obs"), 3),round(cor(comparison$gimes_index, comparison$dzs_cpi, use ="complete.obs"), 3),round(cor(comparison$volume, comparison$eurostat_hicp, use ="complete.obs"), 3),round(cor(comparison$semantic_total, comparison$eurostat_hicp, use ="complete.obs"), 3),round(cor(comparison$semantic_inflacija, comparison$eurostat_hicp, use ="complete.obs"), 3) ))kable(correlations, caption ="Korelacije između različitih mjera inflacije") %>%kable_styling(bootstrap_options =c("striped", "hover"), full_width =FALSE) %>%row_spec(which.max(correlations$Korelacija), bold =TRUE, background = colors_gimes["success"])